Completed
Push — master ( be34ee...8d67fa )
by Maxence
03:05
created

nav.displayCirclesList   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.3142
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
/*
2
 * Circles - Bring cloud-users closer together.
3
 *
4
 * This file is licensed under the Affero General Public License version 3 or
5
 * later. See the COPYING file.
6
 *
7
 * @author Maxence Lange <[email protected]>
8
 * @copyright 2017
9
 * @license GNU AGPL version 3 or any later version
10
 *
11
 * This program is free software: you can redistribute it and/or modify
12
 * it under the terms of the GNU Affero General Public License as
13
 * published by the Free Software Foundation, either version 3 of the
14
 * License, or (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU Affero General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU Affero General Public License
22
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
 *
24
 */
25
26
/** global: OC */
27
/** global: OCA */
28
/** global: Notyf */
29
30
/** global: actions */
31
/** global: nav */
32
/** global: elements */
33
/** global: settings */
34
/** global: resultCircles */
35
/** global: resultMembers */
36
/** global: resultLinks */
37
/** global: curr */
38
/** global: api */
39
/** global: define */
40
41
var nav = {
42
43
	initNavigation: function () {
44
		this.initElementsAddMemberNavigation();
45
		this.initElementsLinkCircleNavigation();
46
		this.initElementsCircleNavigation();
47
48
		this.displayCirclesList('all');
49
	},
50
51
52
	initElementsAddMemberNavigation: function () {
53
54
		elements.addMember.hide();
55
		elements.addMember.on('input propertychange paste focus', function () {
56
			var search = $(this).val().trim();
57
			if (search === '') {
58
				elements.membersSearchResult.fadeOut(curr.animationMenuSpeed);
59
				return;
60
			}
61
62
			actions.searchMembersRequest(search);
63
			if (elements.membersSearchResult.children().length === 0) {
64
				elements.membersSearchResult.fadeOut(curr.animationMenuSpeed);
65
			} else {
66
				elements.membersSearchResult.fadeIn(curr.animationMenuSpeed);
67
			}
68
		}).blur(function () {
69
			setTimeout(function () {
70
				elements.membersSearchResult.fadeOut(curr.animationMenuSpeed);
71
				nav.circlesActionReturn();
72
			}, 100);
73
		});
74
		elements.addMember.on('keydown', function (e) {
75
			if (e.keyCode === 27) {
76
				nav.circlesActionReturn();
77
			}
78
			if (e.keyCode === 13) {
79
				api.addMember(curr.circle, $(this).val(), resultMembers.addMemberResult);
80
			}
81
82
		});
83
	},
84
85
86
	initElementsLinkCircleNavigation: function () {
87
88
		elements.linkCircle.hide();
89
		elements.linkCircle.on('keydown', function (e) {
90
91
			if (e.keyCode === 27) {
92
				nav.circlesActionReturn();
93
			}
94
			if (e.keyCode !== 13) {
95
				return;
96
			}
97
98
			api.linkCircle(curr.circle, elements.linkCircle.val(),
99
				resultLinks.linkCircleResult);
100
		}).blur(function () {
101
			nav.circlesActionReturn();
102
		});
103
	},
104
105
106
	initElementsCircleNavigation: function () {
107
108
		elements.joinCircle.hide();
109
		elements.joinCircle.on('click', function () {
110
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
111
			nav.circlesActionReturn();
112
		});
113
114
		elements.leaveCircle.hide();
115
		elements.leaveCircle.on('click', function () {
116
			api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
117
			nav.circlesActionReturn();
118
		});
119
120
		elements.destroyCircle.on('click', function () {
121
			OC.dialogs.confirm(
122
				t('circles', 'Are you sure you want to delete this circle?'),
123
				t('circles', 'This action is irreversible'),
124
				function (e) {
125
					if (e === true) {
126
						api.destroyCircle(curr.circle, resultCircles.destroyCircleResult);
127
					}
128
				});
129
		});
130
131
		elements.joinCircleAccept.on('click', function () {
132
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
133
		});
134
135
		elements.joinCircleReject.on('click', function () {
136
			api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
137
		});
138
	},
139
140
141
	displayCirclesList: function (type) {
142
143
		curr.circlesType = type;
144
		curr.searchCircle = '';
145
		curr.searchUser = '';
146
147
		curr.circle = 0;
148
		curr.circleLevel = 0;
149
150
		elements.navigation.show('slide', 800);
151
		elements.emptyContent.show(800);
152
		elements.mainUI.fadeOut(800);
153
154
		elements.circlesSearch.val('');
155
		elements.addMember.val('');
156
		elements.linkCircle.val('');
157
158
		this.resetCirclesTypeSelection(type);
159
		elements.resetCirclesList();
160
		api.listCircles(type, '', 0, resultCircles.listCirclesResult);
161
	},
162
163
164
	resetCirclesTypeSelection: function (type) {
165
		elements.circlesList.children('div').removeClass('selected');
166
		elements.circlesList.children().each(function () {
167
			if ($(this).attr('circle-type') === type.toLowerCase()) {
168
				$(this).addClass('selected');
169
			}
170
		});
171
	},
172
173
	circlesActionReturn: function () {
174
		nav.displayCircleButtons(true);
175
		settings.displaySettings(false);
176
		nav.displayAddMemberInput(false);
177
		nav.displayLinkCircleInput(false);
178
		nav.displayJoinCircleButton(false);
179
		nav.displayInviteCircleButtons(false);
180
	},
181
182
	joinCircleAction: function () {
183
		nav.displayCircleButtons(false);
184
		nav.displayAddMemberInput(false);
185
		nav.displayLinkCircleInput(false);
186
		nav.displayJoinCircleButton(true);
187
	},
188
189
	displayCircleButtons: function (display) {
190
		if (display) {
191
			elements.buttonCircleActionReturn.hide(define.animationMenuSpeed);
192
			elements.buttonCircleActions.delay(define.animationMenuSpeed).show(
193
				define.animationMenuSpeed);
194
		} else {
195
			elements.buttonCircleActions.hide(define.animationMenuSpeed);
196
			elements.buttonCircleActionReturn.delay(define.animationMenuSpeed).show(
197
				define.animationMenuSpeed);
198
		}
199
	},
200
201
	displayAddMemberInput: function (display) {
202
		if (display) {
203
			elements.addMember.val('');
204
			elements.addMember.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
205
				function () {
206
					$(this).focus();
207
				});
208
		} else {
209
			elements.addMember.hide(define.animationMenuSpeed);
210
		}
211
	},
212
213
	displayLinkCircleInput: function (display) {
214
		if (display) {
215
			elements.linkCircle.val('');
216
			elements.linkCircle.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
217
				function () {
218
					$(this).focus();
219
				});
220
		} else {
221
			elements.linkCircle.hide(define.animationMenuSpeed);
222
		}
223
	},
224
225
226
	displayInviteCircleButtons: function (display) {
227
		if (display) {
228
			elements.joinCircleAccept.show(define.animationMenuSpeed);
229
			elements.joinCircleReject.delay(define.animationMenuSpeed).show(
230
				define.animationMenuSpeed);
231
		} else {
232
			elements.joinCircleAccept.hide(define.animationMenuSpeed);
233
			elements.joinCircleReject.hide(define.animationMenuSpeed);
234
		}
235
	},
236
237
	displayJoinCircleButton: function (display) {
238
		if (display) {
239
			if (curr.circleStatus === 'Invited') {
240
				elements.joinCircle.hide(define.animationMenuSpeed);
241
				elements.leaveCircle.hide(define.animationMenuSpeed);
242
				nav.displayInviteCircleButtons(true);
243
244
			} else {
245
				nav.displayInviteCircleButtons(false);
246
247
				if (curr.circleLevel === 0 && curr.circleStatus !== 'Requesting') {
248
					elements.joinCircle.delay(define.animationMenuSpeed).show(
249
						define.animationMenuSpeed);
250
					elements.leaveCircle.hide(define.animationMenuSpeed);
251
					elements.joinCircleAccept.hide(define.animationMenuSpeed);
252
					elements.joinCircleReject.hide(define.animationMenuSpeed);
253
254
				}
255
				else {
256
					elements.leaveCircle.delay(define.animationMenuSpeed).show(
257
						define.animationMenuSpeed);
258
					elements.joinCircle.hide(define.animationMenuSpeed);
259
				}
260
			}
261
		} else {
262
			elements.joinCircle.hide(define.animationMenuSpeed);
263
			elements.leaveCircle.hide(define.animationMenuSpeed);
264
		}
265
	},
266
267
268
	/**
269
	 *
270
	 * @param display
271
	 */
272
	displayOptionsNewCircle: function (display) {
273
		if (display) {
274
			elements.newType.fadeIn(300);
275
			elements.newSubmit.fadeIn(500);
276
			elements.newTypeDefinition.fadeIn(700);
277
		}
278
		else {
279
			elements.newType.fadeOut(700);
280
			elements.newSubmit.fadeOut(500);
281
			elements.newTypeDefinition.fadeOut(300);
282
		}
283
	},
284
285
286
	displayMembers: function (members) {
287
288
		elements.remMember.fadeOut(300);
289
		elements.rightPanel.fadeOut(300);
290
291
		elements.mainUIMembersTable.emptyTable();
292
		if (members === null) {
293
			elements.mainUIMembersTable.hide(200);
294
			return;
295
		}
296
297
		elements.mainUIMembersTable.show(200);
298
		for (var i = 0; i < members.length; i++) {
299
			var tmpl = elements.generateTmplMember(members[i]);
300
			elements.mainUIMembersTable.append(tmpl);
301
		}
302
303
		for (i = 0; i < 10; i++) {
304
			if (curr.circleLevel < 9 && curr.circleLevel <= i) {
305
				$('.level-select option[value="' + i + '"]').attr('disabled', 'disabled');
306
			}
307
		}
308
309
310
		elements.mainUIMembersTable.children('tr.entry').each(function () {
311
312
				var userId = $(this).attr('member-id');
313
314
				//
315
				// level
316
				var level = $(this).attr('member-level');
317
				var levelSelect = $(this).find('.level-select');
318
				if (level === '0') {
319
					levelSelect.hide();
320
				}
321
				else {
322
					levelSelect.show(200).val(level);
323
				}
324
				levelSelect.on('change', function () {
325
					actions.changeMemberLevel(userId, $(this).val());
326
				});
327
328
				//
329
				// status
330
				var status = $(this).attr('member-status');
331
				var statusSelect = $(this).find('.status-select');
332
333
				statusSelect.on('change', function () {
334
					actions.changeMemberStatus(userId, $(this).val());
335
				});
336
				statusSelect.append($('<option>', {
337
					value: status,
338
					text: t('circles', status)
339
				})).val(status);
340
341
				if (curr.circleLevel <= $(this).attr('member-level')) {
342
					return;
343
				}
344
345
				if (status === 'Member' || status === 'Invited') {
346
					statusSelect.append($('<option>', {
347
						value: 'remove_member',
348
						text: t('circles', 'Kick this member')
349
					}));
350
				}
351
352
				if (status === 'Requesting') {
353
					statusSelect.append($('<option>', {
354
						value: 'accept_request',
355
						text: t('circles', 'Accept the request')
356
					}));
357
					statusSelect.append($('<option>', {
358
						value: 'dismiss_request',
359
						text: t('circles', 'Dismiss the request')
360
					}));
361
				}
362
363
			}
364
		);
365
	},
366
367
368
	displayLinks: function (links) {
369
370
		elements.mainUILinksTable.emptyTable();
371
		if (links.length === 0) {
372
			elements.mainUILinksTable.hide(curr.animationSpeed);
373
			return;
374
		}
375
376
		elements.mainUILinksTable.show(curr.animationSpeed);
377
		for (var i = 0; i < links.length; i++) {
378
			var tmpl = elements.generateTmplLink(links[i]);
379
			elements.mainUILinksTable.append(tmpl);
380
		}
381
		//
382
		// for (i = 0; i < 10; i++) {
383
		// 	if (curr.circleLevel < 9 && curr.circleLevel <= i) {
384
		// 		$('.level-select option[value="' + i + '"]').attr('disabled', 'disabled');
385
		// 	}
386
		// }
387
388
389
	},
390
391
392
	displayCircleDetails: function (details) {
393
		elements.circlesDetails.children('#name').text(details.name);
394
		elements.circlesDetails.children('#type').text(t('circles', details.typeLongString));
395
396
		elements.buttonCircleActions.show(300);
397
		elements.addMember.hide(300);
398
	},
399
400
401
	displayMembersInteraction: function (details) {
402
		if (details.user.level < define.levelModerator) {
403
			elements.buttonAddMember.hide();
404
		} else {
405
			elements.buttonAddMember.show();
406
		}
407
408
		nav.displayMemberInteractionLinks(details);
409
410
		elements.joinCircleInteraction.hide();
411
		elements.buttonJoinCircle.show();
412
413
		this.displayNonMemberInteraction(details);
414
415
		if (details.user.level === define.levelOwner) {
416
			elements.destroyCircle.show();
417
			elements.buttonCircleSettings.show();
418
			elements.buttonJoinCircle.hide();
419
		}
420
421
	},
422
423
	displayMemberInteractionLinks: function (details) {
424
		if (curr.allowed_federated === '0' || curr.circleSettings['allow_links'] !== 'true' ||
0 ignored issues
show
Coding Style introduced by
['allow_links'] could be written in dot notation.

You can rewrite this statement in dot notation:

var obj = { };
obj['foo'] = 'bar'; // Bad
obj.foo = 'bar'; // Good
Loading history...
425
			details.type === 'Personal' ||
426
			details.user.level < define.levelAdmin
427
		) {
428
			elements.buttonLinkCircle.hide();
429
		}
430
		else {
431
			elements.buttonLinkCircle.show();
432
		}
433
	},
434
435
436
	displayNonMemberInteraction: function (details) {
437
		elements.joinCircleAccept.hide();
438
		elements.joinCircleReject.hide();
439
		elements.joinCircleRequest.hide();
440
		elements.joinCircleInvite.hide();
441
		elements.buttonCircleSettings.hide();
442
		elements.destroyCircle.hide();
443
444
		if (details.user.status === 'Requesting') {
445
			elements.joinCircleRequest.show();
446
			return;
447
		}
448
449
		if (details.user.status === 'Invited') {
450
			elements.joinCircleInvite.show();
451
			return;
452
		}
453
454
		if (details.user.level > 0) {
455
			return;
456
		}
457
458
		setTimeout(function () {
459
			nav.joinCircleAction();
460
		}, 200);
461
	}
462
463
};
464
465